package belleza.relativa

import org.springframework.dao.DataIntegrityViolationException
import belleza.relativa.security.User

class ConversacionController extends InterceptorController {

    static allowedMethods = [save: "POST", update: "POST", delete: "POST"]

    def transient conversacionService

    def index() {
        redirect(action: "list", params: params)
    }

    def list() {
        params.max = Math.min(params.max ? params.int('max') : 10, 100)
        [conversacionInstanceList: Conversacion.list(params), conversacionInstanceTotal: Conversacion.count()]
    }

    def create() {
        [conversacionInstance: new Conversacion(params)]
    }

    def save() {
        User user = springSecurityService.getCurrentUser() as User
        def map = conversacionService.crear(user?.getPersona()?.getId(), params.segundaPersona.id)
        if (!map["saved"])
            flash.message = message(code: 'conversacion.notCreated.message')
        else
            flash.message = message(code: 'conversacion.created.message')
        redirect(controller: 'perfilPrivado', action: 'indexUsuario')
    }

    def show() {
        def conversacionInstance = Conversacion.get(params.id)
        if (!conversacionInstance) {
            flash.message = message(code: 'default.not.found.message', args: [message(code: 'conversacion.label', default: 'Conversacion'), params.id])
            redirect(action: "list")
            return
        }
        def user = springSecurityService.getCurrentUser() as User
        def persona = user.getPersona()
        def mensajes = conversacionService.getMensajesDeConversacion(conversacionInstance.id)
        [conversacionInstance: conversacionInstance, persona: persona, mensajes: mensajes]
    }

    def edit() {
        def conversacionInstance = Conversacion.get(params.id)
        if (!conversacionInstance) {
            flash.message = message(code: 'default.not.found.message', args: [message(code: 'conversacion.label', default: 'Conversacion'), params.id])
            redirect(action: "list")
            return
        }

        [conversacionInstance: conversacionInstance]
    }

    def update() {
        def conversacionInstance = Conversacion.get(params.id)
        if (!conversacionInstance) {
            flash.message = message(code: 'default.not.found.message', args: [message(code: 'conversacion.label', default: 'Conversacion'), params.id])
            redirect(action: "list")
            return
        }

        if (params.version) {
            def version = params.version.toLong()
            if (conversacionInstance.version > version) {
                conversacionInstance.errors.rejectValue("version", "default.optimistic.locking.failure",
                        [message(code: 'conversacion.label', default: 'Conversacion')] as Object[],
                        "Another user has updated this Conversacion while you were editing")
                render(view: "edit", model: [conversacionInstance: conversacionInstance])
                return
            }
        }

        conversacionInstance.properties = params

        if (!conversacionInstance.save(flush: true)) {
            render(view: "edit", model: [conversacionInstance: conversacionInstance])
            return
        }

        flash.message = message(code: 'default.updated.message', args: [message(code: 'conversacion.label', default: 'Conversacion'), conversacionInstance.id])
        redirect(action: "show", id: conversacionInstance.id)
    }

    def delete() {
        def conversacionInstance = Conversacion.get(params.id)
        if (!conversacionInstance) {
            flash.message = message(code: 'default.not.found.message', args: [message(code: 'conversacion.label', default: 'Conversacion'), params.id])
            redirect(action: "list")
            return
        }

        try {
            conversacionInstance.delete(flush: true)
            flash.message = message(code: 'default.deleted.message', args: [message(code: 'conversacion.label', default: 'Conversacion'), params.id])
            redirect(action: "list")
        }
        catch (DataIntegrityViolationException e) {
            flash.message = message(code: 'default.not.deleted.message', args: [message(code: 'conversacion.label', default: 'Conversacion'), params.id])
            redirect(action: "show", id: params.id)
        }
    }

    def enviarMensaje() {
        def user = springSecurityService?.getCurrentUser() as User
        Persona usuario = user?.getPersona()
        Persona destinatario = Persona.findById(params.personaId)
        Conversacion conversacion = Conversacion.findByPrimeraPersonaAndSegundaPersona(usuario, destinatario)
        if (!conversacion) {
            conversacion = Conversacion.findByPrimeraPersonaAndSegundaPersona(destinatario, usuario)
        }
        if (!conversacion) {
            conversacionService.crear(usuario.getId(), destinatario.getId())
            conversacion = Conversacion.findByPrimeraPersonaAndSegundaPersona(usuario, destinatario)
        }
        if (params.mensaje && conversacion) {
            Mensaje mensaje = new Mensaje()
            mensaje.setEmisor(usuario)
            mensaje.setReceptor(destinatario)
            mensaje.setMensaje(params.mensaje)
            mensaje.setFechaEmision(new Date())
            mensaje.setLeido(false)
            mensaje.save(failOnError: true, flush: true)
            conversacionService.agregarMensaje(conversacion.id, mensaje)
        }
        redirect(action: 'show', params: [id: conversacion.id])
    }
}
